package com.miniapp.web.controller.miniapp.api;

import com.alibaba.fastjson.JSONObject;
import com.miniapp.basics.entity.R;
import com.miniapp.basics.service.IMiniAppUserService;
import com.miniapp.common.config.MiniappConfig;
import com.miniapp.common.core.controller.BaseController;
import com.miniapp.common.core.domain.AjaxResult;
import com.miniapp.common.core.domain.entity.miniapp.MiniAppUser;
import com.miniapp.common.core.domain.entity.miniapp.dto.MiniAppUserDTO;
import com.miniapp.common.core.domain.entity.miniapp.dto.MiniAppUserPassWord;
import com.miniapp.common.core.domain.model.LoginUser;
import com.miniapp.common.core.redis.RedisCache;
import com.miniapp.common.exception.MiniAppException;
import com.miniapp.common.utils.SecurityUtils;
import com.miniapp.common.utils.StringUtils;
import com.miniapp.common.utils.file.FileUploadUtils;
import com.miniapp.common.utils.file.MimeTypeUtils;
import com.miniapp.common.utils.sign.Md5Utils;
import com.miniapp.framework.web.service.MiniAppLoginService;
import com.miniapp.framework.web.service.TokenService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Set;

@RestController
@RequestMapping("/miniapp")
public class WxMiniAppUserController extends BaseController
{
    @Autowired
    private IMiniAppUserService miniAppUserService;

    @Autowired
    private TokenService tokenService;

    @Autowired
    private MiniAppLoginService miniAppLoginService;

    /**
     * 获取微信小程序用户信息
     * @return
     */
    @GetMapping("/getMiniAppUserInfo")
    public R getMiniAppUserInfo()
    {
        LoginUser loginUser = getLoginUser();
        MiniAppUser miniAppUser = loginUser.getMiniAppUser();
//        //查询数据库中的用户
//        MiniAppUser newMiniAppUser = miniAppUserService.selectMiniAppUserById(miniAppUser.getId());
//
//        //设置手机号
//        miniAppUser.setPurePhoneNumber(newMiniAppUser.getPurePhoneNumber());
//        //设置平安货运险出单权限
//        miniAppLoginService.setMiniAppUserPaicftiAuth(miniAppUser);
//
//        //刷新缓存
//        tokenService.setLoginUser(loginUser);


        return R.success(miniAppUser);
    }

    /**
     * 更新微信小程序用户信息
     * @param miniAppUserDTO
     * @return
     */
    @PostMapping("/updateMiniAppUser")
    public R updateMiniAppUser(@RequestBody MiniAppUserDTO miniAppUserDTO)
    {
        LoginUser loginUser = getLoginUser();
        //这里防止被人恶意发包修改 通过Security获取当前的id
        miniAppUserService.updateMiniAppUser(new MiniAppUser(miniAppUserDTO,loginUser.getMiniAppUser().getId()));
        //更新缓存
        loginUser.getMiniAppUser().setNickName(miniAppUserDTO.getNickName());
        loginUser.getMiniAppUser().setSex(miniAppUserDTO.getSex());
        tokenService.setLoginUser(loginUser);
        return R.success();
    }

    @PostMapping("/uploadAvatar")
    public R uploadAvatar(@RequestParam("avatarfile") MultipartFile file) throws MiniAppException
    {
        LoginUser loginUser = getLoginUser();
        JSONObject data = miniAppUserService.uploadAvatar(loginUser.getMiniAppUser(), file);
        return R.success(data);
    }

    /**
     * 修改密码
     * @param miniAppUserPassWord
     * @return
     */
    @PostMapping("/updateMiniAppUserPassWord")
    public R updatePassWord(@RequestBody MiniAppUserPassWord miniAppUserPassWord)
    {

        String oldPassWord = miniAppUserPassWord.getOldPassWord();
        String newPassWord = miniAppUserPassWord.getNewPassWord();
        if(StringUtils.isBlank(oldPassWord) || StringUtils.isBlank(newPassWord)){
            logger.info("旧密码和新密码不能为空");
            return R.fail("旧密码和新密码不能为空");
        }
        if(newPassWord.length() < 6){
            return R.fail("密码最少为6位");
        }

        LoginUser loginUser = getLoginUser();
        //1、获取当前登录的微信用户
        MiniAppUser miniAppUser = loginUser.getMiniAppUser();
        String openId = miniAppUser.getOpenId();
        String purePhoneNumber = miniAppUser.getPurePhoneNumber();
        if(StringUtils.isBlank(purePhoneNumber)){
            logger.info("请先绑定手机号");
            return R.fail("请先绑定手机号");
        }

        //2、获取手机号对应的微信用户
        MiniAppUser queryMiniAppUser = new MiniAppUser();
        queryMiniAppUser.setPurePhoneNumber(purePhoneNumber);
        List<MiniAppUser> miniAppUserList = miniAppUserService.selectMiniAppUserList(queryMiniAppUser);
        MiniAppUser miniAppUserMain = miniAppUserList.get(0);
//        String openIdMain = miniAppUserMain.getOpenId();
//        if(!openIdMain.equals(openId)){
//            logger.info("对不起您没有权限修改密码");
//            return R.fail("对不起您没有权限修改密码");
//        }

        //3、验证旧密码
        String md5OldPassWord = Md5Utils.hash(oldPassWord + MiniAppLoginService.MINI_APP_PASSWORD_SALT);
        String password = miniAppUserMain.getPassword();
        if(!md5OldPassWord.equals(password)){
            logger.info("旧密码不正确");
            return R.fail("旧密码不正确");
        }
        //4、修改密码
        String md5NewPassWord = Md5Utils.hash(newPassWord + MiniAppLoginService.MINI_APP_PASSWORD_SALT);
        miniAppUserMain.setPassword(md5NewPassWord);
        miniAppUserService.updateMiniAppUser(miniAppUserMain);
        logger.info("密码修改成功");

        //5、退出：删除所有用户缓存记录
        //存入缓存中，在修改密码时删除全部token
        logger.info("开始删除所有手机号对应的token");
        Boolean aBoolean = redisCache.hasKey(MiniAppLoginService.PHONE_LOGIN_ALL_TOKEN + purePhoneNumber);
        if(aBoolean){
            Set<String> phoneTokenSet = redisCache.getCacheSet(MiniAppLoginService.PHONE_LOGIN_ALL_TOKEN + purePhoneNumber);
            for (String token : phoneTokenSet) {
                tokenService.delLoginUser(token,true);
            }
            redisCache.deleteObject(MiniAppLoginService.PHONE_LOGIN_ALL_TOKEN + purePhoneNumber);
        }

        logger.info("删除所有手机号对应的token完成");

        return R.success("修改成功");
    }

    @Autowired
    private RedisCache redisCache;

}















